package com.ruoyi.web.controller.sujian;

import com.alibaba.fastjson.JSON;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.CxSelect;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.framework.shiro.util.AuthorizationUtils;
import com.ruoyi.system.domain.SysParamter;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.service.ISysParamterService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author  ytl  20211011
 * 参数管理模块
 */
@Controller
@RequestMapping("/sujian/parameterManagement")
public class ParameterManagementController extends BaseController {
    private String prefix = "propertys/sujian/parameterManagement";

    @Autowired
    public ISysParamterService sysParamterService;

    @Autowired
    public ISysDictDataService sysDictDataService;


    @GetMapping("csManagement")
    public String csManagement(ModelMap mmap){
        //获取参数
        SysDictData sysDictData = new SysDictData();
        sysDictData.setDictType("sys_paramter");
        sysDictData.setRemark("");
        List<SysDictData> sysDictDataList = sysDictDataService.findDictDataList(sysDictData);
        List<CxSelect> cxSelects = new ArrayList<>();
        CxSelect cxSelect = new CxSelect();
        cxSelect.setN("所有");
        cxSelect.setV("");
        cxSelects.add(cxSelect);
        for (SysDictData dictData : sysDictDataList){
            cxSelect = new CxSelect();
            cxSelect.setN(dictData.getDictLabel());
            cxSelect.setV(dictData.getDictValue());
            cxSelects.add(cxSelect);
        }
        mmap.put("data", JSON.toJSON(cxSelects));
        return prefix + "/param";
    }

//    @RequiresPermissions("sujian:parameterManagement:list")
    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(SysParamter sysParamter){
        startPage();
        List<SysParamter> list = sysParamterService.listSysParamter(sysParamter);
        return getDataTable(list);
    }

    @GetMapping("/calculate")
    public String calculate(ModelMap mmap){
        SysDictData sysDictData = new SysDictData();
        sysDictData.setDictType("sys_paramter");
        sysDictData.setRemark("jsgs");
        mmap.put("data", JSON.toJSON(getCxSelect(sysDictData)));
        return prefix+"/calculate";
    }
//    @RequiresPermissions("sujian:parameterManagement:calculateValue")
    @Log(title = "参数管理-计算", businessType = BusinessType.INSERT)
    @PostMapping("/calculateValue")
    @ResponseBody
    public AjaxResult calculateValue()
    {
        boolean falg = true;
        String ktCode = getDicCode("空调");
        String hjCode = getDicCode("合计");
        String areaCode = getDicCode("所属面积");
        String djzCode = getDicCode("大机组");
        String xjzCode = getDicCode("小机组");
        
        SysParamter sysParamter = new SysParamter();
        Double area = areas();
        sysParamter.setParamterValue(String.valueOf(area));
        //从数字字典中获取空调 - 合计 - 所属面积 的code
        sysParamter.setParamterName("空调");
        sysParamter.setParamterId(ktCode);
        sysParamter.setParamterLlName("合计");
        sysParamter.setParamterLlId(hjCode);
        sysParamter.setParamterLl2Name("所属面积");
        sysParamter.setParamterLl2Id(areaCode);
        if(sysParamterService.listSysParamter(sysParamter).size()>0){
            falg = sysParamterService.updeteSysParamter(sysParamter)>0?true:false;
        }else{
            sysParamter.setParamterUUID(UUID.randomUUID().toString());
            sysParamter.setBak("计算空调所属面积合计，大机组面积加小机组面积");
            falg = sysParamterService.insertSysParamter(sysParamter)>0?true:false;
        }
        //计算 空调 耗油费/平方米 系数   耗油费合计/所属面积合计
        double hyfhj = getParamValue("空调","合计","耗油费小计");
        DecimalFormat df = new DecimalFormat("#.000");
        sysParamter = new SysParamter();

        sysParamter.setParamterName("空调");
        sysParamter.setParamterId(ktCode);
        sysParamter.setParamterLlName("大机组");
        sysParamter.setParamterLlId(djzCode);
        sysParamter.setParamterLl2Name("耗油费/平方米");
        sysParamter.setParamterLl2Id(getDicCode("耗油费/平方米"));
        System.out.println("hyf="+df.format(hyfhj/area));
        sysParamter.setParamterValue(df.format(hyfhj/area));
        if(sysParamterService.listSysParamter(sysParamter).size()>0){
            falg = sysParamterService.updeteSysParamter(sysParamter)>0?true:false;
        }else{
            sysParamter.setParamterUUID(UUID.randomUUID().toString());
            sysParamter.setBak("计算空调大机组耗油费系数，耗油费合计除以面积合计");
            falg = sysParamterService.insertSysParamter(sysParamter)>0?true:false;
        }
        //计算 空调 耗油费小计 系数   所属面积*耗油费/平方米
        double djzArea = getParamValue("空调","大机组","所属面积");
        Double hyxs = Double.parseDouble(df.format(hyfhj/area));
        sysParamter = new SysParamter();

        sysParamter.setParamterName("空调");
        sysParamter.setParamterId(ktCode);
        sysParamter.setParamterLlName("大机组");
        sysParamter.setParamterLlId(djzCode);
        sysParamter.setParamterLl2Name("耗油费小计");
        sysParamter.setParamterLl2Id(getDicCode("耗油费小计"));
        sysParamter.setParamterValue(df.format(hyxs*djzArea));
        System.out.println("耗油费小计="+hyxs*djzArea);
        if (sysParamterService.listSysParamter(sysParamter).size()>0){
            falg = sysParamterService.updeteSysParamter(sysParamter)>0?true:false;
        }else{
            sysParamter.setParamterUUID(UUID.randomUUID().toString());
            sysParamter.setBak("计算空调大机组耗油费，耗油费系数乘大机组面积");
            falg = sysParamterService.insertSysParamter(sysParamter)>0?true:false;
        }
        double xjzArea = getParamValue("空调","小机组","所属面积");
        sysParamter = new SysParamter();
        sysParamter.setParamterName("空调");
        sysParamter.setParamterId(ktCode);
        sysParamter.setParamterLlName("小机组");
        sysParamter.setParamterLlId(xjzCode);
        sysParamter.setParamterLl2Name("耗油费小计");
        sysParamter.setParamterLl2Id(getDicCode("耗油费小计"));
        sysParamter.setParamterValue(df.format(hyxs*xjzArea));
        if (sysParamterService.listSysParamter(sysParamter).size()>0){
            falg = sysParamterService.updeteSysParamter(sysParamter)>0?true:false;
        }else{
            sysParamter.setParamterUUID(UUID.randomUUID().toString());
            sysParamter.setBak("计算空调小机组耗油费，耗油费系数乘小机组面积");
            falg = sysParamterService.insertSysParamter(sysParamter)>0?true:false;
        }
        //  计算 空调  耗电小计  耗油天数,吨数 *  空调每天耗电量
        double hytd = getParamValue("空调","大机组","耗油天数,吨数");
        double zbdxs = getParamValue("系数变动情况","变更事项","空调每天耗电量(主楼)"); 
        sysParamter = new SysParamter();

        sysParamter.setParamterName("空调");
        sysParamter.setParamterId(ktCode);
        sysParamter.setParamterLlName("大机组");
        sysParamter.setParamterLlId(djzCode);
        sysParamter.setParamterLl2Name("耗电小计");
        sysParamter.setParamterLl2Id(getDicCode("耗电小计"));
        sysParamter.setParamterValue(df.format(hytd*zbdxs));
        if (sysParamterService.listSysParamter(sysParamter).size()>0){
            falg = sysParamterService.updeteSysParamter(sysParamter)>0?true:false;
        }else{
            sysParamter.setParamterUUID(UUID.randomUUID().toString());
            sysParamter.setBak("计算空调大机组耗电小计，耗油天数/吨数乘空调每天耗电量(主楼)");
            falg = sysParamterService.insertSysParamter(sysParamter)>0?true:false;
        }
        double fbdxs = getParamValue("系数变动情况","变更事项","空调每天耗电量(附楼)");
        sysParamter = new SysParamter();

        sysParamter.setParamterName("空调");
        sysParamter.setParamterId(ktCode);
        sysParamter.setParamterLlName("小机组");
        sysParamter.setParamterLlId(xjzCode);
        sysParamter.setParamterLl2Name("耗电小计");
        sysParamter.setParamterLl2Id(getDicCode("耗电小计"));
        sysParamter.setParamterValue(df.format(hytd*fbdxs));
        if (sysParamterService.listSysParamter(sysParamter).size()>0){
            falg = sysParamterService.updeteSysParamter(sysParamter)>0?true:false;
        }else{
            sysParamter.setParamterUUID(UUID.randomUUID().toString());
            sysParamter.setBak("计算空调小机组耗电小计，耗油天数/吨数乘空调每天耗电量(附楼)");
            falg = sysParamterService.insertSysParamter(sysParamter)>0?true:false;
        }
        //  计算 耗电量/平方米   耗电小计/所属面积
        sysParamter = new SysParamter();

        sysParamter.setParamterName("空调");
        sysParamter.setParamterId(ktCode);
        sysParamter.setParamterLlName("大机组");
        sysParamter.setParamterLlId(djzCode);
        sysParamter.setParamterLl2Name("耗电量/平方米");
        sysParamter.setParamterLl2Id(getDicCode("耗电量/平方米"));
        sysParamter.setParamterValue(df.format(hytd*zbdxs/djzArea));
        if (sysParamterService.listSysParamter(sysParamter).size()>0){
            falg = sysParamterService.updeteSysParamter(sysParamter)>0?true:false;
        }else{
            sysParamter.setParamterUUID(UUID.randomUUID().toString());
            sysParamter.setBak("计算空调大机组耗电/平方米系数，耗电小计除以大机组面积");
            falg = sysParamterService.insertSysParamter(sysParamter)>0?true:false;
        }
        sysParamter = new SysParamter();

        sysParamter.setParamterName("空调");
        sysParamter.setParamterId(ktCode);
        sysParamter.setParamterLlName("小机组");
        sysParamter.setParamterLlId(djzCode);
        sysParamter.setParamterLl2Name("耗电量/平方米");
        sysParamter.setParamterLl2Id(getDicCode("耗电量/平方米"));
        sysParamter.setParamterValue(df.format(hytd*fbdxs/xjzArea));
        if (sysParamterService.listSysParamter(sysParamter).size()>0){
            falg = sysParamterService.updeteSysParamter(sysParamter)>0?true:false;
        }else{
            sysParamter.setParamterUUID(UUID.randomUUID().toString());
            sysParamter.setBak("计算空调小机组耗电/平方米系数，耗电小计除以小机组面积");
            falg = sysParamterService.insertSysParamter(sysParamter)>0?true:false;
        }
        return toAjax(falg);
    }
    public String getDicCode(String str){
        SysDictData dictData = new SysDictData();
        dictData.setDictLabel(str);
        String dicValue ="";
        List<SysDictData> list = sysDictDataService.findDictDataList(dictData);
        if (list.size()>0) dicValue = list.get(0).getDictValue();
        return dicValue;
    }
    public Double getParamValue(String str1,String str2,String str3){
        double value =0.00;
        SysParamter sysParamter = new SysParamter();
        sysParamter.setParamterName(str1);
        sysParamter.setParamterLlName(str2);
        sysParamter.setParamterLl2Name(str3);
        List<SysParamter> paramterList = new ArrayList<>();
        paramterList = sysParamterService.listSysParamter(sysParamter);
        if (paramterList.size()>0)  value = Double.parseDouble(paramterList.get(0).getParamterValue());
        return value;
    }
    public Double areas(){
        double totalArea = getParamValue("空调","大机组","所属面积")+getParamValue("空调","小机组","所属面积");
        return totalArea;
    }
    @GetMapping("/add")
    public String add(ModelMap mmap){
        SysDictData sysDictData = new SysDictData();
        sysDictData.setDictType("sys_paramter");
        sysDictData.setRemark("");
        mmap.put("data", JSON.toJSON(getCxSelect(sysDictData)));
        return prefix+"/add";
    }

    public List<CxSelect> getCxSelect(SysDictData sysDictData){
        List<SysDictData> sysDictDataList=sysDictDataService.findDictDataList(sysDictData);//获得一级菜单
//        CxSelect select = new CxSelect();
        List<CxSelect> selects = new ArrayList<>();
        for (SysDictData dictData:sysDictDataList){
            CxSelect dlSelect = new CxSelect(); //存放一级菜单
            List<CxSelect> dlSelects = new ArrayList<>();
            SysDictData dd = new SysDictData();
            dd.setRemark(dictData.getDictValue());
            dd.setDictType(dictData.getDictType());
            List<SysDictData> xlList = sysDictDataService.findDictDataList(dd);//获得二级菜单
            for (SysDictData data:xlList){
                CxSelect xlSelect = new CxSelect(); //存放二级菜单
                List<CxSelect> xlSelects = new ArrayList<>();
                SysDictData ddata = new SysDictData();
                ddata.setDictType(data.getDictType());
                ddata.setRemark(data.getDictValue());
                List<SysDictData> xxlList = sysDictDataService.findDlParamter(ddata);
                for (SysDictData dt : xxlList) {
                    CxSelect cxSelect = new CxSelect();
                    cxSelect.setV(dt.getDictValue());
                    cxSelect.setN(dt.getDictLabel());
                    xlSelects.add(cxSelect);
                }
                xlSelect.setV(data.getDictValue());
                xlSelect.setN(data.getDictLabel());
                xlSelect.setS(xlSelects);
                dlSelects.add(xlSelect);
            }
            dlSelect.setV(dictData.getDictValue());
            dlSelect.setN(dictData.getDictLabel());
            dlSelect.setS(dlSelects);
            selects.add(dlSelect);
        }
        return  selects;
    }
//    @RequiresPermissions("sujian:parameterManagement:add")
    @Log(title = "参数管理-新增", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(@Validated SysParamter sysParamter)
    {
        sysParamter.setParamterUUID(UUID.randomUUID().toString());
        sysParamter.setParamterName(getDicValue(sysParamter.getParamterId()));
        sysParamter.setParamterLlName(getDicValue(sysParamter.getParamterLlId()));
        sysParamter.setParamterLl2Name(getDicValue(sysParamter.getParamterLl2Id()));
        return toAjax(sysParamterService.insertSysParamter(sysParamter));
    }
    public String getDicValue(String str1){
        String ids = "";
        SysDictData data = new SysDictData();
        if("".equals(str1)) return "";
        else {
            data.setDictValue(str1);
            data.setDictType("sys_paramter");
            List<SysDictData> diclist = new ArrayList<>();
            diclist = sysDictDataService.findDictDataList(data);
            if(diclist.size()>0) ids = diclist.get(0).getDictLabel();
            return ids;
        }
    }
    @GetMapping("/getData")
    @ResponseBody
    public String getData(){

        return "";
    }
    /**
     * 校验参数ID
     */
    @PostMapping("/checkParamIDUnique")
    @ResponseBody
    public String checkParamIDUnique(SysParamter sysParamter)
    {
        System.out.println(sysParamter.toString());
        System.out.println(sysParamterService.checkParamIDUnique(sysParamter));
        return sysParamterService.checkParamIDUnique(sysParamter);
    }
    /**
     * 删除参数
     * remove
     */
//    @RequiresPermissions("sujian:parameterManagement:remove")
    @Log(title = "用户管理", businessType = BusinessType.DELETE)
    @PostMapping("/remove")
    @ResponseBody
    public AjaxResult remove(String ids)
    {
        boolean falg=true;
        List<String> idList  = Arrays.asList(ids.split(","));
        for (String id:idList) {
            SysParamter sysParamter = new SysParamter();
            sysParamter.setParamterUUID(id);
            int i = sysParamterService.deleteSysParamter(sysParamter);
            if(i<=0) falg = false;
        }
        return toAjax(falg);
    }

    /**
     * 修改用户
     */
    @GetMapping("/edit/{paramterUUID}")
    public String edit(@PathVariable("paramterUUID") String paramterUUID, ModelMap mmap)
    {
          SysParamter sysParamter = new SysParamter();
          sysParamter.setParamterUUID(paramterUUID);
          mmap.put("params",sysParamterService.listSysParamter(sysParamter).get(0));
        return prefix + "/edit";
    }

    /**
     * 修改保存参数
     */
//    @RequiresPermissions("sujian:parameterManagement:edit")
    @Log(title = "参数管理", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    @ResponseBody
    public AjaxResult editSave(@Validated SysParamter sysParamter)
    {

        AuthorizationUtils.clearAllCachedAuthorizationInfo();
        return toAjax(sysParamterService.updeteSysParamter(sysParamter));
    }

    @Log(title = "参数管理", businessType = BusinessType.EXPORT)
//    @RequiresPermissions("sujian:parameterManagement:export")
    @PostMapping("/export")
    @ResponseBody
    public AjaxResult export(SysParamter sysParamter)
    {
        List<SysParamter> list = sysParamterService.listSysParamter(sysParamter);
        ExcelUtil<SysParamter> util = new ExcelUtil<SysParamter>(SysParamter.class);
        return util.exportExcel(list, "参数管理");
    }

    @Log(title = "参数管理", businessType = BusinessType.IMPORT)
//    @RequiresPermissions("sujian:parameterManagement:import")
    @PostMapping("/importData")
    @ResponseBody
    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
    {
        ExcelUtil<SysParamter> util = new ExcelUtil<SysParamter>(SysParamter.class);
        List<SysParamter> sysParamterList = util.importExcel(file.getInputStream());
        List<SysParamter> list = new ArrayList<>();
        for (SysParamter sysParamter:sysParamterList){
            SysDictData data = new SysDictData();
            data.setDictType("sys_paramter");
            data.setRemark("");
            data.setDictLabel(sysParamter.getParamterName());
            List<SysDictData> diclist = sysDictDataService.findDictDataList(data);
            String ids = "";
            if(diclist.size()>0) ids = diclist.get(0).getDictValue();
            sysParamter.setParamterId(ids);

            data = new SysDictData();
            data.setDictType("sys_paramter");
            data.setRemark(ids);
            data.setDictLabel(sysParamter.getParamterLlName());
            diclist = new ArrayList<>();
            String id1 = "";
            diclist = sysDictDataService.findDictDataList(data);
            if(diclist.size()>0) id1 = diclist.get(0).getDictValue();
            sysParamter.setParamterLlId(id1);

            data = new SysDictData();
            data.setDictType("sys_paramter");
            data.setRemark(id1);
            data.setDictLabel(sysParamter.getParamterLl2Name());
            diclist = new ArrayList<>();
            String id2 = "";
            diclist = sysDictDataService.findDictDataList(data);
            if(diclist.size()>0) id2 = diclist.get(0).getDictValue();
            sysParamter.setParamterLlId(id2);
            list.add(sysParamter);
        }
        String operName = ShiroUtils.getSysUser().getLoginName();
        String message=sysParamterService.importSysParamter(list,updateSupport,operName);
//        String message = userService.importUser(userList, updateSupport, operName);
        return AjaxResult.success(message);
    }
//    @RequiresPermissions("sujian:parameterManagement:view")
    @GetMapping("/importTemplate")
    @ResponseBody
    public AjaxResult importTemplate()
    {
        ExcelUtil<SysParamter> util = new ExcelUtil<SysParamter>(SysParamter.class);
        return util.importTemplateExcel("参数数据");
    }
}
